/**
 * Axios 封装
 */
import axios, { type AxiosInstance, type AxiosRequestConfig } from 'axios'
import { showNotify } from 'vant'

export * from './interface'
export * from './modules/cinema'
export * from './modules/city'
export * from './modules/film'

const config: AxiosRequestConfig = {
  // 请求基准路径
  baseURL: import.meta.env.VITE_API_URL,
  // 请求超时时间设置
  timeout: 1000 * 10
}

class RequestHttp {
  service: AxiosInstance

  constructor(config: AxiosRequestConfig) {
    // 创建一个新的 axios 实例
    this.service = axios.create(config)

    /**
     * 请求拦截器
     *    1. 数据的加密
     *    2. 签名
     *    3. token 的携带
     *    4. 刷新 token
     */
    this.service.interceptors.request.use((config) => {
      return config
    })

    /**
     * 响应拦截器
     *    1. 数据的解密
     *    2. 刷新 token
     */
    this.service.interceptors.response.use(
      (response) => {
        // 解构出接口返回值
        const { data } = response
        if (data.status === 0) {
          return data.data
        }

        showNotify({
          message: data.msg
        })
        return Promise.reject(data)
      },
      (error) => {
        return Promise.reject(error)
      }
    )
  }

  // 封装常用的 get 请求
  get<T>(code: string, params?: object, _object = {}): Promise<T> {
    return this.service.get('/gateway', {
      params,
      headers: {
        'X-Host': code
      },
      ..._object
    })
  }

  post<T>(code: string, params?: object | string, _object = {}): Promise<T> {
    return this.service.post('/gateway', params, {
      headers: {
        'X-Host': code
      },
      ..._object
    })
  }
}

export default new RequestHttp(config)
